/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package adirector;

import com.neurotechnology.NMatcher.NMatcher;
import pkg1ifxArchivos.cifxLogs;

/**
 *
 * @author gabriel
 */
public class saOspeedMatch{// extends Thread{

    private Record[] rtemplates= new Record[0];
    private NMatcher matcher;
    private static cifxLogs olog =null;// new cifxLogs("appbots.log");
    private int nestadogeneral=-1; //-9 En ejecucion, -2 ERROR Inesperado, -1 Transaccion no procesada, 0 Time OUT, 1 Transaccion procesada OK,202 Encontrado nemo
    private Record[] rresultado = new Record[0];
    private String sresultados=""; //Cadena de resultados en formato, cantidad|documentos|documentos|n...
    private byte[] template;
    private int numrespOK=0;
    private boolean turbo=false;
    private int matchtereshold=90;
    public boolean Salir=false;
    public void setTurbo(boolean dato)
    {
        turbo=dato;
    }
    public boolean getTurbo()
    {
        return turbo;
    }
        
    //public saOspeedMatch(NMatcher mdato,cifxLogs ldato, boolean dturbo,int matthereshold, boolean mtchlocal)
    public saOspeedMatch(cifxLogs ldato, boolean dturbo,int matthereshold)
    {
        try{
            /*NMatcher tmp=null;
            if(mtchlocal)
            {
                tmp = new NMatcher();
            }
            else
            {
                tmp=mdato;
            }
             * Este es el codigo que dependia de la llamada con la matcher original
             */
            olog = ldato;
            //matcher=mdato;
            matchtereshold=matthereshold;
            matcher= new NMatcher();
            matcher.setEyesMatchingThreshold(matchtereshold);
            matcher.setFingerMatchingTreshold(matchtereshold);
            matcher.setFaceMatchingThreshold(matchtereshold);
            turbo=dturbo;
        //rtemplates=rdato;
        }
        catch(OutOfMemoryError oe)
        {
          olog.outMensaje("saOspeedMatch.saOspeedMatch(): ERROR OutOfMemoryError : "+oe);
        }
        catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.saOspeedMatch(): ERROR : "+e.getMessage());
        }
        
    }
    public void setTemplate(byte[] dato)
    {
        try{
            template=dato;

        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.setTemplate(): ERROR : "+e.getMessage());
        }
    }
    public byte[] getTemplate()
    {
        return template;
    }
    public void setMacher(NMatcher dato)
    {
        try{
            matcher=dato;

        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.setMacher(): ERROR : "+e.getMessage());
        }
    }
    public NMatcher getMatcher()
    {
        return matcher;
    }
    public void setEstado(int dato)
    {
        nestadogeneral=dato;
    }
    public int getEstado()
    {
        return nestadogeneral;
    }
    public void setRecords(Record[] rdato)
    {
        rtemplates=rdato;
    }

    public Record[] getRecords()
    {
        return rtemplates;
    }
    public void agregaRecord(Record dato)
    {
        try{
            Record[] rtmp= new Record[rtemplates.length];
            System.arraycopy(rtemplates, 0, rtmp, 0, rtemplates.length);
            rtemplates = new Record[rtemplates.length+1];
            System.arraycopy(rtmp, 0, rtemplates, 0, rtmp.length);
            rtemplates[rtemplates.length-1]=dato;

        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.agregaRecord(): ERROR : "+e.getMessage());
        }
        
    }
    public void setResultado(Record[] dato)
    {
       rresultado=dato;
    }
    private synchronized void agregaResultados(Record dato)
    {
        try{
            Record[] rtmp= new Record[rresultado.length];
            System.arraycopy(rresultado, 0, rtmp, 0, rresultado.length);
            rresultado = new Record[rresultado.length+1];
            System.arraycopy(rtmp, 0, rresultado, 0, rtmp.length);
            rresultado[rresultado.length-1]=dato;

        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.agregaResultados(): ERROR : "+e.getMessage());
        }
    }
    public Record[] getResultados()
    {
       return rresultado;
    }
    public void setDocResultados(String dato)
    {
        sresultados=dato;
    }
    public String getDocResultados()
    {
        return sresultados;
    }
    public String getDocResultados(int dato)
    {
        try{
            sresultados="";
            if(rresultado.length>0)
            {
                for(int i=0;i<rresultado.length;i++)
                {
                    sresultados=sresultados+"|"+rresultado[i].getName();
                }
                //sresultados=rresultado.length+"|"+sresultados;
            }
            return sresultados;
        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.getDocResultados(): ERROR : "+e.getMessage());

            return "";
        }

    }
    public void setNumResOK(int dato)
    {
        numrespOK=dato;
    }
    public int getNumRespOK()
    {
        return numrespOK;
    }
    public synchronized int find(boolean dato)
    {
        try{
            nestadogeneral=-1;
            rresultado=new Record[0];
            numrespOK=0;
            sresultados="";
            //List<Record> frs = rtemplates;
            int score=0;
            matcher.identifyStart(template);
            byte[] btmp;

            int cuantostemplates=rtemplates.length;
            nestadogeneral=-9;
            for(int i=0;i<cuantostemplates;i++)
            {

                btmp=rtemplates[i].getTempalte();

                if(btmp!=null)
                {
                    score = matcher.identifyNext(btmp);
                    //matcher.verify(btmp, template);
                    if(score !=0)
                    {
                        numrespOK++;
                        sresultados=sresultados+"|"+rtemplates[i].getName();
                        //agregaResultados(rtemplates[i]);
                        nestadogeneral=202;//Aviso que encontre un
                        matcher.identifyEnd();
                        olog.outMensaje("saOspeedMatch.find(): *** MATCHING **** ");
                        return i;

                    }
                }

            }
            matcher.identifyEnd();

        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.find(): ERROR(1) : "+e.getMessage());
            //olog.outMensaje(""+e);
            nestadogeneral=-2;
            
            matcher =null;
            

        }
        return -1;
    }
    public synchronized void find()//Original
    {
        try{
            nestadogeneral=-1;
            rresultado=new Record[0];
            numrespOK=0;
            sresultados="";
            //List<Record> frs = rtemplates;
            int score=0;
            matcher.identifyStart(template);
            byte[] btmp;

            int cuantostemplates=rtemplates.length;
            //olog.outMensaje("saOspeedMatch.find(): *** INICIO **** : ");
            nestadogeneral=-9;
            for(int i=0;i<cuantostemplates;i++)
            {
                
                btmp=rtemplates[i].getTempalte();

                if(btmp!=null)
                {
                    score = matcher.identifyNext(btmp);
                    //matcher.verify(btmp, template);
                    if(score !=0)
                    {
                        numrespOK++;
                        sresultados=sresultados+"|"+rtemplates[i].getName();
                        //Strail 23feb2012 agregaResultados(rtemplates[i]);
                        nestadogeneral=202;//Aviso que encontre un
                        //olog.outMensaje("saOspeedMatch.find(): *** MATCH **** : "+sresultados);
                        
                        if(turbo)
                        {
                            //matcher.identifyEnd();
                            break;
                        }
                        
                    }


                }
                if(Salir)
                {
                    //matcher.identifyEnd();
                        break;
                }

            }
            matcher.identifyEnd();
            if(nestadogeneral==-9)
                nestadogeneral=1;

            //olog.outMensaje("saOspeedMatch.find(): *** FIN **** : ");
        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.find(): ERROR(2) : "+e.getMessage());
            //olog.outMensaje(""+e);
            nestadogeneral=-2;
            matcher =null;

        }
    }
    public synchronized void __find()//El Nitro
    {
        try{
            nestadogeneral=-1;
            rresultado=new Record[0];
            numrespOK=0;
            sresultados="";
            //List<Record> frs = rtemplates;
            int score=0;
            matcher.identifyStart(template);
            byte[] btmp;
            //Pa lo del invertido
            int o=rtemplates.length-1;
            byte[] btmpO;
            int scoreO=0;
            int cuantostemplates=rtemplates.length;
            for(int i=0;i<cuantostemplates;i++)
            {
                nestadogeneral=-9;
                btmp=rtemplates[i].getTempalte();

                //if(btmp.length>0)
                //{
                    //Strail 15feb2012 int score = matcher.identifyNext(rtemplates[i].getTempalte());
                    score = matcher.identifyNext(btmp);
                    //score = matcher.verify(template,btmp);
                    //int score = matcher.verify(template, btmp);
                    if(score !=0)
                    {
                        sresultados=sresultados+"|"+rtemplates[i].getName();
                        agregaResultados(rtemplates[i]);
                        numrespOK++;
                        if(turbo)
                            break;
                    }
                    else
                    {
                        if(turbo)
                        {
                            btmpO=rtemplates[o].getTempalte();
                            o--;
                            scoreO = matcher.identifyNext(btmpO);
                            //scoreO = matcher.verify(template,btmpO);
                            if(scoreO !=0)
                            {
                                sresultados=sresultados+"|"+rtemplates[o].getName();
                                agregaResultados(rtemplates[o]);
                                numrespOK++;

                                break;
                            }
                        }
                    }
                    if(turbo)
                    {
                        if(i>=(cuantostemplates-1)/2)
                        {
                            if(o<=(cuantostemplates-1)/2)
                                break;
                        }
                    }
                //}
                //else
                //{
                //    olog.outMensaje("saOspeedMatch.find(): ERROR Hay un Template que no existe en : "+i);

                //}
            }
            matcher.identifyEnd();
            nestadogeneral=1;
        }catch(Exception e)
        {
            olog.outMensaje("saOspeedMatch.find(): ERROR(3) : "+e.getMessage());
            olog.outMensaje("saOspeedMatch.find(): ERROR(4) : "+e.toString());
            nestadogeneral=-2;
            matcher=null;

        }
    }

    /*@Override
    public void run() //Se usa para hacer la busqueda del template
    {
        find();

    }
     *
     */
}
